﻿////ШАР ВПИСАНИЙ У КУБ
//================================
//
//Write by Artur Ataev (STEP-ODESA-25.12.2014)
//mail: art.post.ua@gmail.com

using System;

namespace less_prj_01
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Clear();
            Console.Write("Введіть діаметр шару : ");

            int diametr = System.Convert.ToInt32(Console.ReadLine());
            int[, ,] kub = new int[diametr, diametr, diametr];

            BuildFigure(kub);
            DrawLayer(kub);
        }
    
		//Вписання шару у куб
		static void BuildFigure(int [,,] kub)
		{
			int diametr = kub.GetLength(0);
            float radius = diametr / 2;
            float xCenter = radius;
            float yCenter = radius;
            float lay_radius;
            
            for (int z = 0; z < diametr; ++z)
            {
                int h = z;
                for (int y = 0; y < diametr; ++y)
                {
                    for (int x = 0; x < diametr; ++x) 
                    {
                        //розрахунок радіуса кола в залежності від висоти зрізу шару (теорема Піфагора)
                        lay_radius = (float) Math.Sqrt(2 * radius * h - (h*h));
                        int xPoint = x;
                        int yPoint = y;
                        float xTmp = Math.Abs(xPoint - xCenter);
                        float yTmp = Math.Abs(yPoint - yCenter);
                        //знаходження довжини вектора за теоремою Піфагора
                        float len_vec = (float) Math.Sqrt(xTmp*xTmp + yTmp * yTmp );
                        if (len_vec <= lay_radius)
                        { 
                            kub[z, y, x] = 1;
                        }
                        else
                        {
                            kub[z, y, x] = 0;
                        }
                    }
                }
            }
		}
		
		
		//Відображення зрізів
		static void DrawLayer(int [,,] kub)
		{
            int len = kub.GetLength(0);
            for (int z = 0; z < len; ++z)
            {
                int counter = z;
                Console.Clear();
                Console.WriteLine("\tЗріз " + (z+1) + "-го шару.\n");
                
                for (int y = 0; y < len; ++y)
                {
                    Console.Write("\t");
                    for (int x = 0; x < len; ++x)
                    {
                        if (kub[z, y, x] == 1)
                            Console.ForegroundColor = ConsoleColor.Red;
                        else
                            Console.ResetColor();

                        Console.Write(kub[z, y, x]);
                    }

                    //виведення центрального перерізу кожного зрізу
                    Console.Write("\t");
                    for (int i = 0; (counter == z) & (i < len); ++i)
                    {
                        Console.Write(kub[z, (int)(len/2), i]);
                    }
                    ++counter;
                    Console.WriteLine();
                }
				UserAnyKey();
            }
		}
	    
	    //Пауза
	    static void UserAnyKey()
  	 	{
			Console.Write("\n\nДля виведення наступного шару натисніть будь-яку клавішу : ");
   			Console.ReadKey();
	    }
    }
}

